package edu.neusoft.lyc.topic_two.server;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

import java.net.InetAddress;

/**
 * User：lyc
 * Date：2017-11-26
 * Time：12:47
 * Description：
 */
public class HelloServerHandler extends SimpleChannelInboundHandler<String> {
    /**
     * 每次收到消息时触发
     *
     * @param context
     * @param msg
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext context, String msg) {
        // 收到消息直接打印输出
        System.out.println("客户端IP：" + context.channel().remoteAddress() + "发送消息>>>>" + msg);
        // 返回客户端响应
        // writeAndFlush：写入Buffer并刷入，在3.x版本中write()方法是自动flush的
        // 但是在4.0.9之后修改为WriteAndFlush。普通的write方法将不会发送消息。需要手动在write之后flush()一次。
        context.writeAndFlush("got it!");
    }

    /**
     * 当连接活跃(建立)的时候触发 可防止暴力攻击
     * 例如 1S 200-300次请求 IP列入黑名单
     * 下次这个黑名单IP连接时，直接将通道关闭
     *
     * @param context
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext context) throws Exception {
        //输出消息源的远程地址
        System.out.println("检测到客户端IP：" + context.channel().remoteAddress() + "的连接激活");
        //返回欢迎消息
        context.writeAndFlush("Welcome to " + InetAddress.getLocalHost().getHostName() + " service!\n");
        super.channelActive(context);
    }

    /**
     * 当连接不活跃(断开)的时候触发
     * 可清除数据缓存等操作
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        System.out.println("客户端IP：" + ctx.channel().remoteAddress() + "主动断开连接");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        System.out.println("客户端IP：" + ctx.channel().remoteAddress() + "发生异常：" + cause.getMessage());
    }
}
